# -*- coding: utf-8 -*-
"""
预热知识库缓存的管理命令
使用方法: python manage.py warm_knowledge_cache
"""

from django.core.management.base import BaseCommand
from utils.knowledge_cache import knowledge_cache
import time


class Command(BaseCommand):
    help = '预热知识库缓存数据'

    def add_arguments(self, parser):
        parser.add_argument(
            '--categories-only',
            action='store_true',
            help='只预热分类数据',
        )
        parser.add_argument(
            '--articles-only', 
            action='store_true',
            help='只预热文章数据',
        )

    def handle(self, *args, **options):
        self.stdout.write(
            self.style.SUCCESS('开始预热知识库缓存...')
        )
        
        start_time = time.time()
        
        if not options['articles_only']:
            self.warm_categories()
        
        if not options['categories_only']:
            self.warm_articles()
            
        end_time = time.time()
        
        self.stdout.write(
            self.style.SUCCESS(
                f'缓存预热完成！耗时: {end_time - start_time:.2f}秒'
            )
        )

    def warm_categories(self):
        """预热分类缓存"""
        self.stdout.write('预热分类缓存...')
        
        categories = [
            {'id': 1, 'name': '常见疾病', 'icon': '🩺', 'count': 128},
            {'id': 2, 'name': '健康养生', 'icon': '🌱', 'count': 95},
            {'id': 3, 'name': '营养饮食', 'icon': '🥗', 'count': 87},
            {'id': 4, 'name': '运动健身', 'icon': '💪', 'count': 76},
            {'id': 5, 'name': '心理健康', 'icon': '🧠', 'count': 64},
            {'id': 6, 'name': '妇幼保健', 'icon': '👶', 'count': 92},
            {'id': 7, 'name': '中医养生', 'icon': '🌿', 'count': 58},
            {'id': 8, 'name': '急救知识', 'icon': '🚑', 'count': 45},
            {'id': 9, 'name': '用药指南', 'icon': '💊', 'count': 73},
            {'id': 10, 'name': '体检指南', 'icon': '📋', 'count': 41}
        ]
        
        success = knowledge_cache.set_categories(categories)
        if success:
            self.stdout.write(
                self.style.SUCCESS('✓ 分类缓存预热成功')
            )
        else:
            self.stdout.write(
                self.style.ERROR('✗ 分类缓存预热失败')
            )

    def warm_articles(self):
        """预热文章缓存"""
        self.stdout.write('预热文章缓存...')
        
        # 预热常见的查询组合
        cache_scenarios = [
            # 全部文章 - 不同排序
            {'category_id': None, 'page': 1, 'page_size': 12, 'sort_by': 'latest', 'search_query': ''},
            {'category_id': None, 'page': 1, 'page_size': 12, 'sort_by': 'popular', 'search_query': ''},
            {'category_id': None, 'page': 1, 'page_size': 12, 'sort_by': 'favorites', 'search_query': ''},
            
            # 常见疾病分类
            {'category_id': 1, 'page': 1, 'page_size': 12, 'sort_by': 'latest', 'search_query': ''},
            {'category_id': 1, 'page': 1, 'page_size': 12, 'sort_by': 'popular', 'search_query': ''},
            
            # 健康养生分类
            {'category_id': 2, 'page': 1, 'page_size': 12, 'sort_by': 'latest', 'search_query': ''},
            
            # 常见搜索关键词
            {'category_id': None, 'page': 1, 'page_size': 12, 'sort_by': 'latest', 'search_query': '感冒'},
            {'category_id': None, 'page': 1, 'page_size': 12, 'sort_by': 'latest', 'search_query': '高血压'},
            {'category_id': None, 'page': 1, 'page_size': 12, 'sort_by': 'latest', 'search_query': '糖尿病'},
        ]
        
        success_count = 0
        
        for scenario in cache_scenarios:
            try:
                # 这里应该调用实际的数据获取逻辑
                # 为了演示，我们使用静态数据
                mock_data = self.get_mock_articles_data(scenario)
                
                success = knowledge_cache.set_articles(
                    articles_data=mock_data,
                    **scenario
                )
                
                if success:
                    success_count += 1
                    
            except Exception as e:
                self.stdout.write(
                    self.style.WARNING(f'缓存场景失败: {scenario} - {e}')
                )
        
        self.stdout.write(
            self.style.SUCCESS(f'✓ 文章缓存预热完成 ({success_count}/{len(cache_scenarios)})')
        )
        
        # 预热热门标签
        self.warm_hot_tags()

    def warm_hot_tags(self):
        """预热热门标签"""
        self.stdout.write('预热热门标签缓存...')
        
        hot_tags = [
            '感冒发烧', '高血压', '糖尿病', '失眠', '减肥',
            '养胃', '护肝', '补钙', '维生素', '免疫力',
            '颈椎病', '腰椎病', '便秘', '过敏', '咽炎'
        ]
        
        success = knowledge_cache.set_hot_tags(hot_tags)
        if success:
            self.stdout.write(
                self.style.SUCCESS('✓ 热门标签缓存预热成功')
            )
        else:
            self.stdout.write(
                self.style.ERROR('✗ 热门标签缓存预热失败')
            )

    def get_mock_articles_data(self, scenario):
        """获取模拟文章数据"""
        # 这里返回符合场景的模拟数据
        # 实际应用中应该调用真实的数据获取逻辑
        
        mock_articles = [
            {
                'id': 1,
                'title': '春季感冒高发期，如何有效预防？',
                'summary': '春季气温变化大，是感冒高发期...',
                'category': '常见疾病',
                'category_id': 1,
                'read_count': 1250,
                'like_count': 89,
                'tags': ['感冒', '预防', '春季']
            },
            {
                'id': 2, 
                'title': '高血压患者的日常饮食指南',
                'summary': '高血压是常见的慢性疾病...',
                'category': '常见疾病',
                'category_id': 1,
                'read_count': 980,
                'like_count': 67,
                'tags': ['高血压', '饮食', '健康']
            }
        ]
        
        # 根据场景过滤数据
        filtered_articles = mock_articles
        
        if scenario['category_id']:
            filtered_articles = [
                a for a in filtered_articles 
                if a['category_id'] == scenario['category_id']
            ]
        
        if scenario['search_query']:
            query = scenario['search_query'].lower()
            filtered_articles = [
                a for a in filtered_articles
                if query in a['title'].lower() or 
                   any(query in tag.lower() for tag in a['tags'])
            ]
        
        return {
            'articles': filtered_articles,
            'total': len(filtered_articles),
            'page': scenario['page'],
            'page_size': scenario['page_size']
        }